/**
 * 给定三个数组，A、B、C。令f(i,j,k)=Ai*Bj+Bj*Ck+Ck*Ai
 * 求f的第K大的值
 * 首先将A、B、C降序排列，则最大值是f(0,0,0)，最小值是f(N-1,N-1,N-1)
 * 然后考虑二分搜索第K大的数。令二分的判据函数是f(mid)，如果比mid大的数有K个或者更多个，则f(mid)返回0，否则f(mid)返回1
 * 则第一个返回1的mid就是第K大的数。
 * 
 * 现在考虑如何计算有多少个f比mid大
 * 直接枚举即可。因为每一次二分最多数K个即可。而如果没有比mid大的，可以迅速剪枝。
 * 但是超时。
 * 
 * 将最内存的k循环又改为二分，才通过。1145ms。
 * 
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using i128 = __int128_t;

struct _t{
    int a;
    int b;
    int c;
    llt v;
    _t(int i, int j, int k, llt w):a(i),b(j),c(k),v(w){}

};


int N;
int K;
vll A, B, C;


llt f(int i, int j, int k){
    return (llt)A[i] * (0LL + B[j] + C[k]) + (llt)B[j] * C[k];
}

llt bsFirst1(llt start, llt end, function<int(llt)> f){
    assert(start <= end);
	llt left = start, right = end, mid;
	do{
        mid = (left + right) >> 1;
		auto tmp = f(mid);
		assert(0 == tmp or 1 == tmp);
		if(tmp == 1) right = mid - 1;
		else left = mid + 1; 
	}while(left <= right);
	return left;
}

void work(){
    cin >> N >> K;
    A.assign(N, {});
    for(auto & i : A) cin >> i;
    B.assign(N, {});
    for(auto & i : B) cin >> i;    
    C.assign(N, {});
    for(auto & i : C) cin >> i;

    sort(A.begin(), A.end(), greater<int>());
    sort(B.begin(), B.end(), greater<int>());
    sort(C.begin(), C.end(), greater<int>());

    llt end = f(0, 0, 0);
    llt start = f(N - 1, N - 1, N - 1);

    /// f(mid)用于判断mid之后是否有K个或者更多的数比mid大
    /// 如果有返回0，没有返回1
    /// 则第一个1位置就是第K大的数
    auto ans = bsFirst1(start, end, [](llt mid)->int{
        int cnt = 0;
        for(int i=0;i<N;++i){
            if(f(i, 0, 0) <= mid) break;
            for(int j=0;j<N;++j){
                if(f(i, j, 0) <= mid) break;

                /// f(k)用来判断 f(i,j,k)是否比mid大，大的话返回0，不大返回1
                /// 返回第一个为1的位置
                int k = bsFirst1(0, N - 1, [i, j, mid](llt k)->int{
                    auto tmp = f(i, j, k);
                    if(tmp > mid) return 0;
                    return 1;
                });

                /// 则 i,j 中比mid大的刚好有k个
                if((cnt += k) >= K) return 0;
            }
        }
        return 1;
    });

    cout << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    // init();
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}